home *** CD-ROM | disk | FTP | other *** search
/ ASME's Mechanical Engine…ing Toolkit 1997 December / ASME's Mechanical Engineering Toolkit 1997 December.iso / c_lang / varinc.lzh / BLDINDEX.C < prev    next >
C/C++ Source or Header  |  1979-11-30  |  2KB  |  46 lines

  1. /* SOURCE FILE: BLDINDEX.C */
  2. /*****************************************************************************/
  3. /* bldindex() constructs an index file for direct access to a data file.     */
  4. /*   Each output line has two fields: key and offset. The output is written  */
  5. /*   to stdout, so it can be redirected.                                     */
  6. /*   The function takes one or two command-line arguments:                   */
  7. /*       BLDINDEX datafile [key_field_number]                                */
  8. /*****************************************************************************/
  9.  
  10. #include <stdio.h>
  11. #include <stddefs.h>
  12. #define DELIM '|'
  13.  
  14. main(ac, av)
  15. unsigned ac;
  16. char *av[];
  17.  
  18.    {
  19.    IMPORT char *strfld(char[], char[], short), *strchr();
  20.    char buf[BUFSIZ];                               /* buffer for data record */
  21.    char key[BUFSIZ];                             /* key field of data record */
  22.    FILE *p_infile;                                      /* input file stream */
  23.    long file_pos;                             /* return from ftell(): offset */
  24.    short key_field_num = 1;                   /* field number that holds key */
  25.    char *end_pos;                                  /* end-of-record position */
  26.  
  27.    if (ac < 2 || ac > 3)
  28.       err_exit("Use: BLDINDEX datafile [key_field_number]", "");
  29.    if (NULL == (p_infile = fopen(av[1], "r")))
  30.       err_exit("Can't open file: ", av[1]);
  31.    if (ac >= 3)                          /* Key field command-line argument? */
  32.       key_field_num = atoi(av[2]);                 /* Yes; get field number. */
  33.    
  34.    /* Loop for each record (line) of input file. */
  35.    file_pos = ftell(p_infile);
  36.    while (fgets(buf, BUFSIZ, p_infile))
  37.       if ((end_pos = strchr(buf, '\n')))       /* Is there a newline symbol? */
  38.          {
  39.          *end_pos = '\0';                                       /* Strip it. */
  40.          strfld(key, buf, key_field_num);
  41.          if (key[0] != '\0')                            /* Is there any key? */
  42.             printf("%s%c%ld\n", key, DELIM, file_pos);
  43.          file_pos = ftell(p_infile);
  44.          }
  45.    }
  46.